package com.ruoyi.service.impl;

import java.util.List;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.mapper.CarCouponMapper;
import com.ruoyi.mapper.CarUserCouponMapper;
import com.ruoyi.domain.CarCoupon;
import com.ruoyi.domain.CarUserCoupon;
import com.ruoyi.service.ICarCouponService;
import com.ruoyi.service.ICarUserCouponService;

/**
 * 商家优惠券Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-01-27
 */
@Service
public class CarCouponServiceImpl implements ICarCouponService 
{
    @Autowired
    private CarCouponMapper carCouponMapper;
    
    @Autowired
    private CarUserCouponMapper carUserCouponMapper;

    @Autowired
    private ICarUserCouponService carUserCouponService;

    /**
     * 查询商家优惠券
     * 
     * @param id 商家优惠券主键
     * @return 商家优惠券
     */
    @Override
    public CarCoupon selectCarCouponById(Integer id)
    {
        return carCouponMapper.selectCarCouponById(id);
    }

    /**
     * 查询商家优惠券列表
     * 
     * @param carCoupon 商家优惠券
     * @return 商家优惠券集合
     */
    @Override
    public List<CarCoupon> selectCarCouponList(CarCoupon carCoupon)
    {
        System.out.println("=== 开始查询优惠券列表 ===");
        List<CarCoupon> result = carCouponMapper.selectCarCouponList(carCoupon);
        System.out.println("查询结果数量: " + result.size());
        
        for (int i = 0; i < result.size(); i++) {
            CarCoupon coupon = result.get(i);
            System.out.println("第" + (i + 1) + "条优惠券:");
            System.out.println("  ID: " + coupon.getId());
            System.out.println("  名称: " + coupon.getName());
            System.out.println("  类型: " + coupon.getType());
            System.out.println("  折扣: " + coupon.getDiscount());
            System.out.println("  触发金额: " + coupon.getTriggerMoney());
            System.out.println("  优惠金额: " + coupon.getPreferentialMoney());
            System.out.println("  开始时间: " + coupon.getStart());
            System.out.println("  结束时间: " + coupon.getEnd());
            System.out.println("  投放数量: " + coupon.getNum());
            System.out.println("  领取数量: " + coupon.getSize());
            System.out.println("  使用开始时间: " + coupon.getExpirationStart());
            System.out.println("  使用结束时间: " + coupon.getExpirationEnd());
            System.out.println("  状态: " + coupon.getStatus());
            System.out.println("---");
        }
        
        System.out.println("=== 查询完成 ===");
        return result;
    }

    /**
     * 根据商家ID查询优惠券列表
     * 
     * @param merchantId 商家ID
     * @return 优惠券列表
     */
    @Override
    public List<CarCoupon> selectCarCouponByMerchantId(Integer merchantId)
    {
        CarCoupon query = new CarCoupon();
        query.setMId(merchantId);
        return carCouponMapper.selectCarCouponList(query);
    }

    /**
     * 查询可领取的优惠券列表
     * 
     * @return 优惠券列表
     */
    @Override
    public List<CarCoupon> selectAvailableCoupons()
    {
        CarCoupon query = new CarCoupon();
        query.setStatus(0); // 可领取状态
        return carCouponMapper.selectCarCouponList(query);
    }

    /**
     * 新增加商家优惠券
     * 
     * @param carCoupon 商家优惠券
     * @return 结果
     */
    @Override
    public int insertCarCoupon(CarCoupon carCoupon)
    {
        return carCouponMapper.insertCarCoupon(carCoupon);
    }

    /**
     * 修改商家优惠券
     * 
     * @param carCoupon 商家优惠券
     * @return 结果
     */
    @Override
    public int updateCarCoupon(CarCoupon carCoupon)
    {
        return carCouponMapper.updateCarCoupon(carCoupon);
    }

    /**
     * 批量删除商家优惠券
     * 
     * @param ids 需要删除的商家优惠券主键
     * @return 结果
     */
    @Override
    public int deleteCarCouponByIds(Integer[] ids)
    {
        return carCouponMapper.deleteCarCouponByIds(ids);
    }

    /**
     * 删除商家优惠券信息
     * 
     * @param id 商家优惠券主键
     * @return 结果
     */
    @Override
    public int deleteCarCouponById(Integer id)
    {
        return carCouponMapper.deleteCarCouponById(id);
    }

    /**
     * 领取优惠券
     * 
     * @param couponId 优惠券ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    public int receiveCoupon(Integer couponId, Integer userId)
    {
        try {
            System.out.println("=== 开始领取优惠券 ===");
            System.out.println("优惠券ID: " + couponId);
            System.out.println("用户ID: " + userId);
            
            // 1. 检查优惠券是否存在且可领取
            CarCoupon coupon = carCouponMapper.selectCarCouponById(couponId);
            if (coupon == null) {
                System.out.println("优惠券不存在");
                return 0;
            }
            
            if (coupon.getStatus() != 0) {
                System.out.println("优惠券状态不可领取: " + coupon.getStatus());
                return 0;
            }
            
            // 2. 检查优惠券是否还有剩余数量
            if (coupon.getSize() >= coupon.getNum()) {
                System.out.println("优惠券已被领完");
                return 0;
            }
            
            // 3. 检查用户是否已经领取过该优惠券
            CarUserCoupon query = new CarUserCoupon();
            query.setUserId(userId.intValue());
            query.setCouponId(couponId.intValue());
            List<CarUserCoupon> existingCoupons = carUserCouponMapper.selectCarUserCouponList(query);
            
            if (existingCoupons != null && !existingCoupons.isEmpty()) {
                System.out.println("用户已经领取过该优惠券");
                return 0;
            }
            
            // 4. 创建用户优惠券记录
            CarUserCoupon userCoupon = new CarUserCoupon();
            userCoupon.setUserId(userId.intValue());
            userCoupon.setCouponId(couponId.intValue());
            userCoupon.setStatus(0); // 0表示未使用
            userCoupon.setReceiveTime(new Date());
            userCoupon.setNum(1); // 数量为1
            userCoupon.setDeleted(0); // 未删除
            
            // 从商家优惠券复制相关信息
            userCoupon.setCouponName(coupon.getName());
            userCoupon.setCouponType(coupon.getType());
            userCoupon.setPreferentialMoney(coupon.getPreferentialMoney());
            userCoupon.setTriggerMoney(coupon.getTriggerMoney());
            userCoupon.setExpireTime(coupon.getEnd());
            
            int insertResult = carUserCouponMapper.insertCarUserCoupon(userCoupon);
            if (insertResult <= 0) {
                System.out.println("创建用户优惠券记录失败");
                return 0;
            }
            
            // 5. 更新优惠券领取数量
            CarCoupon updateCoupon = new CarCoupon();
            updateCoupon.setId(couponId);
            updateCoupon.setSize(coupon.getSize() + 1);
            
            int updateResult = carCouponMapper.updateCarCoupon(updateCoupon);
            if (updateResult <= 0) {
                System.out.println("更新优惠券领取数量失败");
                return 0;
            }
            
            System.out.println("优惠券领取成功，用户优惠券记录已创建");
            return 1;
            
        } catch (Exception e) {
            System.err.println("领取优惠券异常: " + e.getMessage());
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 使用优惠券
     * 
     * @param couponId 优惠券ID
     * @param userId 用户ID
     * @return 结果
     */
    @Override
    public int useCoupon(Integer couponId, Integer userId)
    {
        try {
            System.out.println("=== 开始使用优惠券 ===");
            System.out.println("优惠券ID: " + couponId);
            System.out.println("用户ID: " + userId);
            
            // 直接调用 CarUserCouponService 的 useCoupon 方法
            // 因为使用优惠券应该更新用户优惠券表，而不是商家优惠券表
            return carUserCouponService.useCoupon(couponId.longValue(), userId.longValue());
            
        } catch (Exception e) {
            System.err.println("使用优惠券异常: " + e.getMessage());
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 检查优惠券是否可用
     * 
     * @param couponId 优惠券ID
     * @param amount 订单金额
     * @return 是否可用
     */
    @Override
    public boolean isCouponAvailable(Integer couponId, Double amount)
    {
        // 这里需要实现检查优惠券可用性的逻辑
        // 暂时返回true
        return true;
    }
}
